package net.crozz.openapi.qq;

import net.crozz.openapi.ApiException;
import net.crozz.openapi.http.Param;
import net.crozz.openapi.http.Requester;
import net.crozz.openapi.qq.model.relation.Resp_add_idol;
import net.crozz.openapi.qq.model.relation.Resp_del_idol;
import net.crozz.openapi.qq.model.relation.Resp_get_fanslist;
import net.crozz.openapi.qq.model.relation.Resp_get_idollist;
import org.apache.commons.lang.StringUtils;

import java.util.List;

public class Relation {

    private final Requester client;
    private final String    baseURL;
    private final String    client_id;

    Relation(Requester client, String baseURL, String client_id) {
        this.client = client;
        this.baseURL = baseURL;
        this.client_id = client_id;
    }

    /**
     * 收听腾讯微博上的用户。
     * 文档地址：http://wiki.connect.qq.com/add_idol
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param name         要收听的用户的账户名列表。最多30个。
     * @param fopenids     要收听的用户的openid列表。最多30个。 name和fopenids至少选一个，若同时存在则以name值为主。
     */
    public Resp_add_idol add_idol(
            String access_token, String openid,
            List<String> name, List<String> fopenids
    ) throws ApiException {
        return client.postObj(
                Resp_add_idol.class,
                baseURL + "relation/add_idol",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("name", StringUtils.join(name, ",")),
                Param.newParam("fopenids", StringUtils.join(fopenids, "_")),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 取消收听腾讯微博上的用户。
     * 文档地址：http://wiki.connect.qq.com/del_idol
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param name         要取消收听的用户的账户名。 可选，name和fopenid至少选一个，若同时存在则以name值为主。
     * @param fopenid      要取消收听的用户的openid。可选，name和fopenid至少选一个，若同时存在则以name值为主。
     */
    public Resp_del_idol del_idol(
            String access_token, String openid, String name, String fopenid
    ) throws ApiException {
        return client.postObj(
                Resp_del_idol.class,
                baseURL + "relation/del_idol",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("name", name),
                Param.newParam("fopenid", fopenid),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 获取登录用户的听众列表。
     * 文档地址：http://wiki.connect.qq.com/get_fanslist
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param reqnum       必须。请求获取的听众个数。取值范围为1-30。
     * @param startindex   必须。请求获取听众列表的起始位置。第一页：0；继续向下翻页：reqnum*（page-1）。
     * @param mode         获取听众信息的模式。获取听众信息的模式，默认值为0。0：旧模式，新添加的听众信息排在前面，最多只能拉取1000个听众的信息。1：新模式，可以拉取所有听众的信息，暂时不支持排序。
     * @param install      判断获取的是安装应用的听众，还是未安装应用的听众。 0：不考虑该参数；1：获取已安装应用的听众信息；2：获取未安装应用的听众信息。
     * @param sex          按性别过滤标识，默认为0。此参数当mode=0时使用，支持排序。 1：获取的是男性听众信息；2：获取的是女性听众信息；0：不进行性别过滤，获取所有听众信息。
     */
    public Resp_get_fanslist get_fanslist(
            String access_token, String openid,
            int reqnum, int startindex, Boolean mode, Integer install, Integer sex
    ) throws ApiException {
        return client.getObj(
                Resp_get_fanslist.class,
                baseURL + "relation/get_fanslist",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("reqnum", reqnum),
                Param.newParam("startindex", startindex),
                Param.newParam("mode", mode),
                Param.newParam("install", install),
                Param.newParam("sex", sex),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 获取登录用户收听的人的列表。
     * 文档地址：http://wiki.connect.qq.com/get_idollist
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param reqnum       必须。请求获取的听众个数。取值范围为1-30。
     * @param startindex   必须。请求获取听众列表的起始位置。第一页：0；继续向下翻页：reqnum*（page-1）。
     * @param mode         获取收听的人的信息模式，默认为0。
     *                     0：旧模式，新添加的收听的人信息排在前面，最多只能拉取1000个收听的人的信息。1：新模式，最多可拉取10000个收听的人的信息，暂不支持排序。
     * @param install      判断获取的是安装了应用的收听好友，还是未安装应用的收听好友。0：不考虑该参数；1：获取已安装应用的收听好友信息；2：获取未安装应用的收听好友信息。
     */
    public Resp_get_idollist get_idollist(
            String access_token, String openid,
            int reqnum, int startindex, Boolean mode, Integer install
    ) throws ApiException {
        return client.getObj(
                Resp_get_idollist.class,
                baseURL + "relation/get_idollist",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("reqnum", reqnum),
                Param.newParam("startindex", startindex),
                Param.newParam("mode", mode),
                Param.newParam("install", install),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

}
